package com.wjm.blog.system.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wjm.blog.common.util.BeanCopyUtil;
import com.wjm.blog.system.entity.SysOpLogEntity;
import com.wjm.blog.system.mapper.SysOpLogMapper;
import com.wjm.blog.system.service.ISysOpLogService;
import com.wjm.blog.system.vo.request.SysOpLogQueryVo;
import com.wjm.blog.system.vo.request.SysOpLogSaveVo;
import com.wjm.blog.system.vo.response.SysOpLogDetailVo;
import com.wjm.blog.system.vo.response.SysOpLogListVo;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 操作日志信息表Service实现类
 *
 * @author wjm
 * @date 2023-10-18T14:34:39.188
 * @version 1.0
 */
@Log4j2
@Service
public class SysOpLogServiceImpl extends ServiceImpl<SysOpLogMapper, SysOpLogEntity> implements ISysOpLogService {

    @Override
    public IPage<SysOpLogListVo> page(SysOpLogQueryVo queryVo) throws Exception {
        log.info("-----SysOpLogServiceImpl.page()方法开始，请求参数：{}",JSON.toJSONString(queryVo));

        // 转换参数实体
        Page page = new Page<>(queryVo.getCurrent(), queryVo.getSize());

        // 调用数据库分页查询方法
        List<SysOpLogListVo> pageList = baseMapper.getList(page, queryVo);

        // 设置分页结果
        page.setRecords(pageList);

        log.info("-----SysOpLogServiceImpl.page()方法结束，返回参数：{}",JSON.toJSONString(page));
        return page;
    }

    @Override
    public List<SysOpLogListVo> list(SysOpLogQueryVo queryVo) throws Exception {
        log.info("-----SysOpLogServiceImpl.list()方法开始，请求参数：{}",JSON.toJSONString(queryVo));

        // 调用数据库查询方法
        List<SysOpLogListVo> list = baseMapper.getList(queryVo);

        log.info("-----SysOpLogServiceImpl.list()方法结束，返回参数：{}",JSON.toJSONString(list));
        return list;
    }

    @Override
    public SysOpLogDetailVo get(Long id) throws Exception {
        log.info("-----SysOpLogServiceImpl.get()方法开始，请求参数：{}",id);

        // 调用数据库查询方法
        SysOpLogEntity entity = this.getById(id);

        // 转换返回实体
        SysOpLogDetailVo detailVo = BeanCopyUtil.beanCopy(entity, SysOpLogDetailVo.class);

        log.info("-----SysOpLogServiceImpl.get()方法结束，返回参数：{}",JSON.toJSONString(detailVo));
        return detailVo;
    }

    @Override
    public boolean insert(SysOpLogSaveVo saveVo) throws Exception {
        log.info("-----SysOpLogServiceImpl.insert()方法开始，请求参数：{}",JSON.toJSONString(saveVo));

        // 转换参数实体
        SysOpLogEntity entity = BeanCopyUtil.beanCopy(saveVo,SysOpLogEntity.class);

        // 调用数据库新增方法
        boolean flag = this.save(entity);

        log.info("-----SysOpLogServiceImpl.insert()方法结束，返回参数：{}",flag);
        return flag;
    }

    @Override
    public boolean update(Long id, SysOpLogSaveVo saveVo) throws Exception {
        log.info("-----SysOpLogServiceImpl.update()方法开始，请求参数：{},{}",id,JSON.toJSONString(saveVo));

        // 转换参数实体
        SysOpLogEntity entity = BeanCopyUtil.beanCopy(saveVo,SysOpLogEntity.class);
        entity.setId(id);

        // 调用数据库修改方法
        boolean flag = this.updateById(entity);

        log.info("-----SysOpLogServiceImpl.update()方法结束，返回参数：{}",flag);
        return flag;
    }

    @Override
    public boolean invalid(List<Long> ids) throws Exception {
        log.info("-----SysOpLogServiceImpl.invalid()方法开始，请求参数：{}",ids);

        // 调用数据库删除方法
        // 如果Entity中的isDeleted字段头上有@TableLogic注解，则会进行逻辑删除。否则会进行物理删除。
        boolean flag = this.removeByIds(ids);

        log.info("-----SysOpLogServiceImpl.invalid()方法结束，返回参数：{}",flag);
        return flag;
    }
}
